package leetcode.linkedlist;

import leetcode.linkedlist.model.ListNode;

public class RemoveLastNode {


    public static ListNode removeLastNode(ListNode head, int lastKth) {
        // 1 -> 2 -> 3  K = 4  没有倒数四个节点，结果返回 1 -> 2 -> 3
        if (head == null || lastKth < 1) {
            return head;
        }
        ListNode cur = head;
        while (cur != null) {
            // 链表指针挪动一次，K-- 一次
            cur = cur.next;
            lastKth--;
            // 第一个K值是 3-1 = 2
            // 链表走到尾部时，走了3步，则K值变化为  2 -> 1 -> 0
        }
        // 1 -> 2 -> 3 -> null  K = 3  K 2 -> 1 -> 0  结果返回  2 -> 3
        // K等于0时，代表当前节点是要被移除的节点
        // 移除头节点
        if (lastKth == 0) {
            return head.next;
        }
        // lastKth > 0 代表需要移除一个非头节点
        // 1 -> 2 -> 3 -> null  K = 2  K 1 -> 0 -> -1 结果返回  1 -> 3
        // 要移除第N-K个节点的下一个节点， 目标是找到这个节点，并将该节点的next修改为  next.next
        // 要修改链表，被移除节点的下个节点修改为 被移除节点的下个节点
        if (lastKth < 0) {
            cur = head;
            // K等于0时，代表当前节点的下一个是要被移除的节点
            // 因为是先自增再比较，所以当K等于0是，cur并没有指向下一个节点，也就是说 cur就是目标节点的上一个节点
            while (++lastKth < 0){
                cur = cur.next;
            }
            // 目标节点要被移除，所以目标节点的上一节点要直接跳过目标节点指向目标节点的下一节点
            cur.next = cur.next.next;
        }

        return head;
    }
}
